﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using ItalcoTransfer;
using ItalcoTransfer.enums;
using ItalcoTransfer.italco.utils;

namespace ItalcoTransfer.italco.vo
{
    
    /*
     * <FIELD ID="NUMERO">
      <NUMERO_CAMPO>0</NUMERO_CAMPO>
      <NOMBRE_SECCION></NOMBRE_SECCION>      
      <MINIMASTER></MINIMASTER>
      <GENERAR_ALTA>S</GENERAR_ALTA>
      <GENERAR_BAJA>S</GENERAR_BAJA>
      <GENERAR_MODIFICACION>S</GENERAR_MODIFICACION>
      <VALOR_POR_DEFECTO></VALOR_POR_DEFECTO>
      <TAMAÑO_MAXIMO>7</TAMAÑO_MAXIMO>
      <VALIDAR_NULO>S</VALIDAR_NULO>
      <TIPO_VALOR>P</TIPO_VALOR>
      <NOMBRE_PROPIEDAD>NUMERO</NOMBRE_PROPIEDAD>
    </FIELD>
     * */
    public class FieldPropertyVO
    {
        public string NombrePropiedad;
        public int NumeroCampo;
        public string Valor;        

        public FieldPropertyVO()
        {
        }
        public FieldPropertyVO(FieldPropertyVO inValue)
        {
            this.NombrePropiedad = inValue.NombrePropiedad;
            this.NumeroCampo = inValue.NumeroCampo;
            this.Valor = inValue.Valor;
        }
    }

    public class FieldVO
    {
        public FieldVO()
        {
            _Propiedades = new List<FieldPropertyVO>();
        }
        public FieldVO(FieldVO inValue)
        {
            _Propiedades = CopyProperties(inValue.FieldProperties);
            this.GenerarAlta = inValue.GenerarAlta;
            this.GenerarBaja = inValue.GenerarBaja;
            this.GenerarModificacion = inValue.GenerarModificacion;
            this.ID = inValue.ID;
            this.Master = inValue.Master;
            this.NombreSeccion = inValue.NombreSeccion;
            this.NumeroCampo = inValue.NumeroCampo;
            this.TamanyoMaximo = inValue.TamanyoMaximo;
            this.ValidarNulo = inValue.ValidarNulo;
            this.ValorDefecto = inValue.ValorDefecto;
            this.FormatoCampo = inValue.FormatoCampo;
            this.RegistroMultiple = inValue.RegistroMultiple;
        }


        #region variables privadas
        private string _sId;                
        private string _sFormatoCampo;
        private string _sNombreSeccion;
        private int _iNumero_Campo;
        private MinimasterVO _oMaster;

        private bool _bGenerarAlta;
        private bool _bGenerarBaja;
        private bool _bGenerarModificacion;
        private string _sValorDefecto;
        private int _iTamMaximo;
        private bool _bValidarNulo;
        private bool _bRegistroMultiple;
        private string _sValor;

        private List<FieldPropertyVO> _Propiedades;
        #endregion

        #region Propiedades


        public  string ID
        {
            get
            {
                return _sId;
            }
            set
            {
                _sId = value;
            }
        }        

        public int NumeroCampo
        {
            get
            {
                return _iNumero_Campo;
            }
            set
            {
                _iNumero_Campo = value;
            }
        }

        public string FormatoCampo
        {
            get
            {
                if (_sFormatoCampo == null)
                    _sFormatoCampo = "";
                return _sFormatoCampo;
            }
            set
            {
                _sFormatoCampo = value;
            }
        }
        public string NombreSeccion
        {
            get
            {
                return _sNombreSeccion;
            }
            set
            {
                _sNombreSeccion = value;
            }
        }
        public MinimasterVO Master
        {
            get
            {
                return _oMaster;
            }
            set
            {
                _oMaster = value;
            }
        }
        public bool RegistroMultiple
        {
            get
            {
                return _bRegistroMultiple;
            }
            set
            {
                _bRegistroMultiple = value;
            }
        }
        public bool GenerarAlta
        {
            get
            {
                return _bGenerarAlta;
            }
            set
            {
                _bGenerarAlta = value;
            }
        }
        public bool GenerarBaja
        {
            get
            {
                return _bGenerarBaja;
            }
            set
            {
                _bGenerarBaja = value;
            }
        }
        public bool GenerarModificacion
        {
            get
            {
                return _bGenerarModificacion;
            }
            set
            {
                _bGenerarModificacion = value;
            }
        }
        public int TamanyoMaximo
        {
            get
            {
                return _iTamMaximo;
            }
            set
            {
                _iTamMaximo = value;
            }
        }
        public bool ValidarNulo
        {
            get
            {
                return _bValidarNulo;
            }
            set
            {
                _bValidarNulo = value;
            }
        }
                
        public string ValorDefecto
        {
            get
            {
                return _sValorDefecto;
            }
            set
            {
                _sValorDefecto = value;
            }
        }
        public string Valor
        {
            get {
                string sValorTemp = "";
                if (this.FormatoCampo != "" && _sValor != "")
                {
                    sValorTemp = double.Parse(_sValor).ToString(FormatoCampo);
                } 
                else                    
                    sValorTemp = _sValor;
                if (TamanyoMaximo > 0 && TamanyoMaximo < sValorTemp.Length)
                    sValorTemp = sValorTemp.Substring(sValorTemp.Length - TamanyoMaximo);
                else if (TamanyoMaximo < 0 && TamanyoMaximo * (-1) < sValorTemp.Length)
                    sValorTemp = sValorTemp.Substring(0, TamanyoMaximo * (-1));

                return sValorTemp;
            }
            set {_sValor = value;}
        }
        public List<FieldPropertyVO> FieldProperties
        {
            get { return _Propiedades; }
            set { _Propiedades = value; }
        }
        
        #endregion

        #region Metodos
        public override string ToString()
        {
            if (this.FormatoCampo != "")
            {
                return string.Format(FormatoCampo, Valor);
            }
            else
                return base.ToString();
        }
        private List<FieldPropertyVO> CopyProperties(List<FieldPropertyVO> inList)
        {
            List<FieldPropertyVO> retValue = new List<FieldPropertyVO>();
            foreach (FieldPropertyVO pVO in inList)
            {
                retValue.Add(new FieldPropertyVO(pVO));
            }
            return retValue;
        }


        //private string GenerarXMLRubricas(enumTipoRegistro Tipo, ref List<ErrorInfo> Errores)
        //{
        //    string sReturn = "";
        //    //string sSec = "", sFecha = "";
        //    string sPropiedades = "";
        //    bool bGenerarTexto = true;

        //    foreach (FieldPropertyVO fP in FieldProperties)
        //    {
        //        string sValorPropiedad = (fP.Valor == null ? "" : fP.Valor);
        //        if (sValorPropiedad == "1002" && fP.NombrePropiedad == "ID")
        //        {
        //            bGenerarTexto = false;
        //        }
        //        else if (sValorPropiedad.Trim() == "1110" && fP.NombrePropiedad == "ID")
        //        {
        //            sPropiedades += " ID=\"0338\" TIPO=\"I\"";
        //        }
        //        else if ((sValorPropiedad.Trim() == "1172" || sValorPropiedad == "1180") && fP.NombrePropiedad == "ID")
        //        {
        //            sPropiedades += " ID=\"0336\" TIPO=\"I\"";
        //        }
        //        else if (fP.NombrePropiedad != "ID" && fP.NombrePropiedad != "TIPO")
        //            sPropiedades += string.Format(" {0}=\"{1}\"", fP.NombrePropiedad, sValorPropiedad.Trim());
                
        //    }
        //    if (sPropiedades == "")
        //        sPropiedades = " SEC=\"\" FECHA=\"\"";
            
        //    string sValor = "";
        //    if (this.Master != null)
        //    {
        //        if (Valor == "" && ValidarNulo == false)
        //        {
        //            sValor = "";
        //        }
        //        else if (Master.Valores.ContainsKey(Valor))
        //            sValor = Master.Valores[Valor].ToString();
        //        else
        //        {
        //            Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorTraduccionCampo_2Params, Valor, Master.Name), this._sId));
        //            throw new italco.utils.TransferException(Resources.TextosError.ErrorTraduccionCampo_2Params, Valor, Master.Name);
        //        }
        //    }
        //    else
        //        if (Valor != "")
        //        {
        //            sValor = double.Parse(Valor).ToString("#.00");
        //        }
        //        else
        //            sValor = Valor;
        //    if (sValor != "")
        //    {                
        //        sReturn = string.Format(Resources.TextosTraduccionXML.TraduccionRubrique_2Params, sPropiedades, sValor);
        //    }
        //    return sReturn;
        //}

        private string GenerarXMLGeneric(enumTipoRegistro Tipo, ref List<ErrorInfo> Errores)
        {
            string sReturn = "";
            //string sSec = "", sFecha = "";
            string sPropiedades = "";
            foreach (FieldPropertyVO fP in FieldProperties)
            {
                string sValorPropiedad = (fP.Valor == null ? "" : fP.Valor);
                if (fP.NombrePropiedad == "SEC" && this.NombreSeccion == "IMPUTA")
                    sValorPropiedad = "1";
                sPropiedades += string.Format(" {0}=\"{1}\"", fP.NombrePropiedad, sValorPropiedad.Trim());
            }
            if (sPropiedades == "")
                sPropiedades = " SEC=\"\" FECHA=\"\"";
            //if (FieldProperties.Where(x => x.NombrePropiedad == "SEC").Count() != 0)
            //    sSec = FieldProperties.Where(x => x.NombrePropiedad == "SEC").Single().Valor;
            //if (FieldProperties.Where(x => x.NombrePropiedad == "FECHA").Count() != 0)
            //    sFecha = FieldProperties.Where(x => x.NombrePropiedad == "FECHA").Single().Valor;

            string sValor = "";
            if (this.Master != null)
            {
                if (Valor == "" && ValidarNulo == false)
                {
                    sValor = "";
                }
                else if (Master.Valores.ContainsKey(Valor))
                    sValor = Master.Valores[Valor].ToString();
                else
                {
                    Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorTraduccionCampo_2Params, Valor, Master.Name), this._sId));
                    throw new italco.utils.TransferException(Resources.TextosError.ErrorTraduccionCampo_2Params, Valor, Master.Name);
                }

            }
            else
                sValor = Valor;
            if (sValor != "")
            {
                if (this.ID == "DRE_SPDIPR99")
                {
                    sValor = double.Parse(Valor).ToString("#.00").Replace(",",".");
                }
                sReturn = string.Format(Resources.TextosTraduccionXML.TraduccionCampo_3Params, ID, sPropiedades, sValor);                
            }
            return sReturn;
        }

        public string GenerateXML(enumTipoRegistro Tipo, ref List<ErrorInfo> Errores)
        {
            try
            {
                string sReturn = "";
                if (Tipo == enumTipoRegistro.Alta && _bGenerarAlta ||
                    Tipo == enumTipoRegistro.Baja && _bGenerarBaja ||
                    Tipo == enumTipoRegistro.Modificacion && _bGenerarModificacion)
                {
                    foreach (FieldPropertyVO fP in FieldProperties)
                    {
                        //Revisar más tarde "Sección Rubricas"
                        string sValorPropiedad = (fP.Valor == null ? "" : fP.Valor);
                        if (sValorPropiedad == "1002" && fP.NombrePropiedad == "ID")
                        {
                            this.NombreSeccion = Resources.TextosTraduccionXML.Seccion_Rubrica_1002;
                            this.ID = "DRE_SPDIPR99";
                        }
                    }

                    //Si es rubrica y noseque, tratar los valores diferente.
                    if (this.NombreSeccion == Resources.TextosTraduccionXML.Seccion_Rubrica)                        
                    {
                        //sReturn = GenerarXMLRubricas(Tipo, ref Errores);
                    }
                    else
                    {
                        sReturn = GenerarXMLGeneric(Tipo, ref Errores);
                    }                    
                }
                return sReturn;
            }
            catch (Exception e)
            {
                Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorGenerarCampo_Seccion_3Params,
                    this.ID, this.NombreSeccion, e.Message), this._sId));
                throw new italco.utils.TransferException(
                    Resources.TextosError.ErrorGenerarCampo_Seccion_3Params,
                    this.ID, this.NombreSeccion, e.Message);
            }
        }

        public FieldVO FillFromTXT(string[] campos, ref List<ErrorInfo> Errores)
        {
            try
            {            
                //Llenamos el valor            
                if (campos.Length-1 < _iNumero_Campo)
                {
                    Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorColumnasInsuficientes_Campo_1Param, _sId ),this._sId));
                    throw new TransferException(Resources.TextosError.ErrorColumnasInsuficientes_Campo_1Param, _sId);
                }
                else
                {
                    if (campos[_iNumero_Campo].Trim()!="" && this.Master != null)
                    {
                        //Utilizar la proppiedad tamanyo maximo también con diccionarios
                        string sValorTemp = campos[_iNumero_Campo].Trim();
                        if (TamanyoMaximo > 0 && TamanyoMaximo < sValorTemp.Length)
                            sValorTemp = sValorTemp.Substring(sValorTemp.Length - TamanyoMaximo);
                        else if (TamanyoMaximo < 0 && TamanyoMaximo * (-1) < sValorTemp.Length)
                            sValorTemp = sValorTemp.Substring(0, TamanyoMaximo * (-1));

                        //No asignamos valor, solo validamos el dato.
                        if (Master.Valores.ContainsKey(sValorTemp))
                            Valor = sValorTemp;
                        else
                        {
                            Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorTraduccionCampo_2Params, campos[_iNumero_Campo], Master.Name), this._sId));
                            //throw new italco.utils.TransferException(Resources.TextosError.ErrorTraduccionCampo_2Params, campos[_iNumero_Campo], Master.Name);
                            throw new Exception(string.Format(Resources.TextosError.ErrorTraduccionCampo_2Params, campos[_iNumero_Campo], Master.Name));
                        }

                    }
                    else if (campos[_iNumero_Campo].Trim() == "")
                    {
                        if (this.ID == "ETA_ETCNOM")
                        {
                            Valor = campos[5] + " " + campos[6];
                        }
                        else
                        {
                            if (this.ValidarNulo)
                            {
                                Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorCampoObligatorio_1Param, _sId), _sId));
                                //throw new italco.utils.TransferException(Resources.TextosError.ErrorCampoObligatorio_1Param);
                                throw new Exception(string.Format(Resources.TextosError.ErrorCampoObligatorio_1Param, _iNumero_Campo));
                            }

                            else
                                Valor = campos[_iNumero_Campo].Trim();
                            }
                    }
                    else
                        Valor = campos[_iNumero_Campo].Trim();
                }
                //Recorremos su lista de propiedades y llenamos su valor
                foreach (FieldPropertyVO fieldProp in FieldProperties)
                {
                    if (campos.Length-1 < fieldProp.NumeroCampo)
                    {
                        Errores.Add(new ErrorInfo(string.Format(Resources.TextosError.ErrorColumnasInsuficientes_Campo_Propiedad_2Params, fieldProp.NombrePropiedad, _sId), ""));                        
                        //throw new TransferException(string.Format(Resources.TextosError.ErrorColumnasInsuficientes_Campo_Propiedad_2Params, fieldProp.NombrePropiedad, _sId), "");                    
                        throw new Exception(string.Format(Resources.TextosError.ErrorColumnasInsuficientes_Campo_Propiedad_2Params, fieldProp.NombrePropiedad, _sId));
                    }
                    else
                    {
                        fieldProp.Valor = campos[fieldProp.NumeroCampo].Trim();
                    }
                }
                //if (NombreSeccion == Resources.TextosTraduccionXML.Seccion_Rubrica)
                //{
                //    bool bGenerarSeccionDiferente = false;
                //    foreach (FieldPropertyVO fVO in FieldProperties)
                //    {
                //        if (fVO.NombrePropiedad == "ID" && fVO.Valor == "1002")
                //            bGenerarSeccionDiferente = true;
                //    }
                //    if (bGenerarSeccionDiferente)
                //    {
                //        FieldProperties.Clear();
                //        FieldProperties = new List<FieldPropertyVO>();
                //        this.Master = null;
                //        this.NombreSeccion = Resources.TextosTraduccionXML.Seccion_Rubrica_1002;                        
                //        this.ID = "DRE_SPDIPR99";
                //    }
                //}

            }
            catch (Exception ex)
            {
                
            }
            return this;
        }
        #endregion

    }
}
